// IO 函子

const fp = require('lodash/fp')

class IO {
    static of (value){
        return new IO(function(){
            return value
        })
    }

    constructor (fn) {
        this._value = fn //将外部函数赋值给_value
    }

    map(fn) {
        // 将fn 和 _value可能存在不纯的函数先保存并返回到一个新的IO对象中
        return new IO(fp.flowRight(fn, this._value))
    }
}

const r = IO.of(process).map(p=>p.execPath) 
console.log(r._value())  // 可以在调用IO函子的时候处理不纯的函数（惰性延迟）